from app import db
from app.models.user import User
from app.models.user_photo import UserPhoto
from sqlalchemy import and_, or_, func, desc, case


class UserDiscoveryService:
    """用户发现 / 搜索服务"""

    @staticmethod
    def discover_users(current_user_id=None, page=1, limit=10, city=None):
        """
        发现用户列表
        :param current_user_id: 当前用户ID，可为None（表示未登录）
        :param page: 页码
        :param limit: 每页数量
        :param city: 城市筛选
        :return: 用户列表和总数
        """
        # 基础查询：只返回正常状态的用户
        query = User.query.filter(User.status == 1)
        
        # 如果用户已登录，排除自己
        if current_user_id:
            query = query.filter(User.id != current_user_id)
            
            # 如果已登录，可以根据用户性别进行筛选
            current_user = User.query.get(current_user_id)
            if current_user and current_user.gender:
                # 默认返回异性用户
                opposite_gender = 1 if current_user.gender == 2 else 2
                query = query.filter(User.gender == opposite_gender)
        
        # 城市筛选
        if city:
            query = query.filter(User.city == city)
        
        # 排序规则：
        # 1. 已登录用户：按照匹配度/活跃度排序
        # 2. 未登录用户：按照推荐度/热门度排序
        if current_user_id:
            # 已登录用户，按照最近登录时间排序
            # 使用 COALESCE 处理 NULL 值
            query = query.order_by(func.coalesce(User.last_login_time, '1970-01-01').desc())
        else:
            # 未登录用户，使用子查询计算照片数量并排序
            # 创建一个子查询来计算每个用户的照片数量
            photo_count_subq = db.session.query(
                UserPhoto.user_id,
                func.count(UserPhoto.id).label('photo_count')
            ).filter(UserPhoto.status == 2).group_by(UserPhoto.user_id).subquery()
            
            # 将子查询与主查询关联
            query = query.outerjoin(
                photo_count_subq,
                User.id == photo_count_subq.c.user_id
            )
            
            # 使用 CASE 语句处理 NULL 值，而不是使用 NULLS FIRST
            # 如果 photo_count 为 NULL，则使用 0 代替
            query = query.order_by(
                desc(func.coalesce(photo_count_subq.c.photo_count, 0)),
                User.created_at.desc()
            )
        
        # 分页查询
        pagination = query.paginate(page=page, per_page=limit, error_out=False)
        
        # 转换为字典并返回
        return [u.to_dict() for u in pagination.items], pagination.total

    @staticmethod
    def search_users(filters: dict, page: int = 1, limit: int = 10):
        query = User.query.filter(User.status == 1)

        gender = filters.get('gender')
        if gender in [1, 2]:
            query = query.filter(User.gender == gender)

        min_age = filters.get('min_age')
        if min_age:
            query = query.filter(User.age >= min_age)

        max_age = filters.get('max_age')
        if max_age:
            query = query.filter(User.age <= max_age)

        city = filters.get('city')
        if city:
            query = query.filter(User.city == city)

        # 使用 COALESCE 处理 NULL 值
        pagination = query.order_by(func.coalesce(User.last_login_time, '1970-01-01').desc()).paginate(page=page, per_page=limit, error_out=False)
        return [u.to_dict() for u in pagination.items], pagination.total 